#正则表达式
"""
此模块导出以下功能：
    match将正则表达式模式匹配到字符串的开头。
    fullmatch将正则表达式模式匹配到所有字符串。
    search搜索字符串以了解模式的存在。
    sub替换发生在字符串中的模式。
    subn与sub相同，但也返回所做的替换次数。
    split通过模式的出现拆分字符串。
    findall查找字符串中模式的所有出现。
    finditer返回一个迭代器，为每个匹配产生匹配对象。
    compile将模式编译成RegexObject。
    purge清除正则表达式缓存。
    转义反斜杠字符串中的所有非字母数字。

该模块中的某些功能将标志作为可选参数：
    A ASCII对于字符串模式，使\ w，\ W，\ b，\ B，\ d，\ D
                   匹配相应的ASCII字符类别
                   （而不是整个Unicode类别，哪个是
                   默认）。
                   对于字节模式，该标志是唯一可用的
                   行为，不需要指定。
    I IGNORECASE执行不区分大小写的匹配。
    L LOCALE使\ w，\ W，\ b，\ B，依赖于当前的语言环境。
    M MULTILINE“^”匹配行的开头（换行后）
                   以及字符串。
                   “$”与行的末尾匹配（在换行之前）
                   作为字符串的结尾。
    S DOTALL“。”匹配任何字符，包括换行符。
    X VERBOSE忽略空白和评论，更好看RE。
    U UNICODE仅用于兼容性忽略了字符串模式（它
                   是默认），并禁止字节模式。

"""
import re
objedata = "hello world elex bdafa;lfafkjafanngfsgka;lslajgflasjg"
#无分组模式
# r = re.match("h\w+",objedata)
# print(r.group())      #获取所有匹配的内容
# print(r.groups())     #获取分组内子元素
# print(r.groupdict())  #获取字典形式的匹配内容
#有分组模式  ?P<keyname>value 字典方式匹配
"""
r = re.match("(?P<key1>h)(?P<key2>\w+)",objedata)
print(r.group())      #获取所有匹配的内容
print(r.groups())     #获取分组内子元素
print(r.groupdict())  #获取字典形式的匹配内容
#从头匹配
re.search()
#浏览全部字符串 匹配第一个符合规则的字符串
re.findall()
#将匹配的所有内容都放置到一个列表中
re.finditer()
#返回一个迭代器，为每个匹配产生匹配对象。
re.fullmatch()
#将正则表达式模式匹配到所有字符串。
re.split()
#通过模式的出现拆分字符串。
re.sub()
#替换发生在字符串中的模式。
re.subn()
#与sub相同，但也返回所做的替换次数。
re.compile()
#compile将模式编译成RegexObject
"""
expres = "1 - 2 * ((60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))"
#regex = re.compile("\([^()]\)")
#计算运算表达式结果
def CountExp(exp):
    return str(eval(exp))

# 处理多层括号运算表达式
def SplitParent(express):
    regex = re.compile("\(([^()]+)\)")
    data = expres
    while True:
        redata = regex.split(data,1)
        #print(redata)
        if len(redata)==3:
            #print(redata)
            one,two,three = redata
            ret = CountExp(str(two))
            data = one + ret + three
        else:
            break
    return CountExp(data)

r = SplitParent(expres)
print(r)